当我输入 时git diff,我想使用我选择的视觉差异工具(Windows 上的 SourceGear “diffmerge”)查看输出。我如何配置 git 来做到这一点?
git diff
从 Git1.6.3 开始,您可以使用 git difftool 脚本 :请参阅下面的答案。
也许这篇文章会对你有所帮助。以下是最好的部分:
指定外部差异工具有两种不同的方法。
第一个是您使用的方法,通过设置 GIT_EXTERNAL_DIFF 变量。但是,该变量应该指向可执行文件的完整路径。此外,由 GIT_EXTERNAL_DIFF 指定的可执行文件将使用一组固定的 7 个参数调用:
path old-file old-hex old-mode new-file new-hex new-mode
由于大多数 diff 工具将需要不同的参数顺序(并且仅需要一些),因此您很可能必须指定一个包装脚本,而后者又会调用真正的 diff 工具。
我更喜欢的第二种方法是 通过 “git config” 配置外部差异工具 。这是我所做的:
1)创建一个包装脚本“git-diff-wrapper.sh”,其中包含类似
-->8-(snip)-- #!/bin/sh # diff is called by git with 7 parameters: # path old-file old-hex old-mode new-file new-hex new-mode "<path_to_diff_executable>" "$2" "$5" | cat --8<-(snap)--
如您所见,只有第二个(“旧文件”)和第五个(“新文件”)参数将传递给 diff 工具。
2) 类型
$ git config --global diff.external <path_to_wrapper_script>
在命令提示符处,替换为“git-diff-wrapper.sh”的路径,因此您的 ~/.gitconfig 包含
-->8-(snip)-- [diff] external = <path_to_wrapper_script> --8<-(snap)--
确保使用正确的语法来指定包装脚本和差异工具的路径,即使用正斜杠而不是反斜杠。就我而言,我有
[diff] external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
在 .gitconfig 和
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
在包装脚本中。注意尾随的“猫”!
(我想 ‘ | cat‘ 仅适用于某些可能无法返回正确或一致的返回状态的程序。如果您的差异工具具有明确的返回状态,您可能想尝试不使用尾随猫)
| cat
(Diomidis Spinellis在评论中补充道:
该cat命令是必需的,因为diff(1)如果文件不同,默认情况下会以错误代码退出。 Git 期望外部 diff 程序仅在发生实际错误时以错误代码退出,例如内存不足。 通过管道输出git到cat非零错误代码被屏蔽。 更有效的是,程序可以只exit使用 0 的参数运行。)
cat
diff(1)
git
exit
那(上面引用的文章)是 通过配置文件 (而不是通过环境变量)定义的外部工具的理论。 在实践中(仍然是外部工具的配置文件定义),您可以参考: